package ferran.tomas.ta;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import org.jdom.Document;

class ClientListener extends Thread
	{
        private BufferedReader r;
		private ServidorPrincipal servidor;
		private Socket s;
		private boolean salir;
		private Document ultimoDocument;

        public ClientListener(ServidorPrincipal servidor) {
			this.servidor = servidor;
			this.s = this.servidor.getS();
			this.salir = true;
		    try {
				this.r = new BufferedReader(new InputStreamReader(s.getInputStream()));
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("ClientListener.ClientListener :	Error Grave. No se puede crear un Listener para el Chat");
				System.exit(1);
			};
		}

		@Override
        public void run()
        {
    		salir = false;		
        	String mensaje;
        	try
        	{	
        		while (!this.salir && s.isConnected())
        		{
        			mensaje = r.readLine();
        			if (mensaje == null) break; 

        			//System.out.println("ClientListener.run: Recibimos xml"+mensaje.replace(">", ">\r\n"));

        			Document xml = utilsXML.getXML(mensaje); 		// XML Con formato correcto o null.
        			if (xml == null) {
        				System.out.println("ClientListener.run: XML incorrecto, ignoramos el mensaje");
        				continue;				// Si es incorrecto, ignoramos el mensaje.
        			}

        			String tipo = utilsXML.getXML_type(xml);
        			System.out.println("ClientListener.run: Hemos recibido un "+tipo+"...enviamos al servidor");
        			if (tipo.equals("chat")) {
        				servidor.addMessage(xml);
        			}
        			else if(!tipo.equals("errorMensaje")){
        				ultimoDocument = xml;
        				synchronized (servidor) {
							servidor.notify();
						}
        			}
        			else {
        				ultimoDocument = xml;
        				servidor.addMessage(xml);
        			}
        		}
        	}
        	catch (IOException e)
        	{
        		if (s.isClosed()) {
        			System.out.println("ClientListener.run: Socket cerrado");
        		} else {
        			System.out.println("ClientListener.run: Read failed / Servidor caido (?)");
        		}
        	}
        	System.out.println("ClientListener.run: Listener Thread Closed");
        }

		public void close() {
			salir = true;
			try { s.close();} catch (IOException e) { System.out.println("ClientListener.close : Error al intentar cerrar el socket");}
			try { this.finalize();} catch (Throwable e) {	e.printStackTrace();}
		}

		public void setUltimoDocument(Document ultimoDocument) {
			this.ultimoDocument = ultimoDocument;
		}

		public Document getUltimoDocument() {
			Document temp = ultimoDocument;
			ultimoDocument = null;
			return temp;
		}
	}

